package main

import "fmt"

func main() {
	// 第一题
	// n 的阶乘，递归版本
	fmt.Println(Factorial_1(5, 1)) // 120
	// n 的阶乘，循环版本
	fmt.Println(Factorial_2(5)) // 120

	// 第二题
	fmt.Println("~~~~~~~~~~~~~~~~~~~~")
	PrintTriangle(5)

	// 第三题
	fmt.Println("~~~~~~~~~~~~~~~~~~~~")
	/*
	   	在Go语言中，defer语句会将其后面跟随的函数调用推迟到当前函数执行完毕时执行。

	   defer 作用：
	   1. 资源清理：确保在函数执行结束后，资源如文件、网络连接等被正确释放。
	   2. 延迟执行：对于需要在函数结束时执行的代码，defer提供了一种确保执行的机制，无论函数是正常结束还是由于错误而提前退出。
	   3. 简化复杂函数：通过defer管理需要在多个退出点执行的操作，可以使函数逻辑更清晰。

	   defer 应用：
	   1. 文件操作：在文件操作中，打开文件后立即使用defer来确保文件最终被关闭，这样可以避免文件泄露。

	   ```go
	   f, err := os.Open("filename")

	   	if err != nil {
	   	    // 处理错误
	   	}

	   defer f.Close()
	   // 文件操作...

	   ```

	   2. 锁操作：当使用锁来控制对共享资源的访问时，可以使用defer来保证锁的释放，避免死锁。
	   ```go
	   mutex.Lock()
	   defer mutex.Unlock()
	   // 临界区代码...
	   ```

	   3. Panic和Recover：defer与recover一起使用，可以捕获和处理panic，防止程序崩溃。
	   ```go
	   	defer func() {
	   	    if r := recover(); r != nil {
	   	        fmt.Println("Recovered in f", r)
	   	    }
	   	}()

	   // 可能引发panic的代码...

	   ```

	   4. 复杂函数清理：对于有多个返回点的函数，defer可以用来集中处理清理逻辑，避免代码重复。
	   ```go
	   	func complexFunction() error {
	   	    resource1, err := initResource1()
	   	    if err != nil {
	   	        return err
	   	    }
	   	    defer cleanupResource1(resource1)

	   	    resource2, err := initResource2()
	   	    if err != nil {
	   	        // resource1的清理将由defer handle
	   	        return err
	   	    }
	   	    defer cleanupResource2(resource2)

	   	    // 函数逻辑...
	   	}

	   ```

	   注意：
	   defer语句按后进先出（LIFO）的顺序执行，最后一个defer语句会首先执行。
	   defer语句中的函数会在包含它们的函数返回之前执行。
	   在 defer 语句中使用的函数可以读取并修改包含它们的函数的返回值。

	   使用defer时要注意内存使用情况，特别是在长时间运行或循环中使用defer可能导致资源不被及时释放。

	   总结：
	   defer是Go语言中一个非常有用的特性，它帮助开发者编写既清晰又安全的代码，特别是在资源管理和异常处理方面。通过合理使用defer，可以确保资源得到正确管理，以及在出现意外情况时能够优雅地恢复执行。
	*/
}
